package com.atguigu.config;

import com.atguigu.entity.BirthAndDeath;
import com.atguigu.mapper.auto.BirthAndDeathMapper;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;

@Component
public class MyAckReceiver implements ChannelAwareMessageListener {

    @Autowired
    private BirthAndDeathMapper birthAndDeathMapper;

    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {
/*
            因为传递消息的时候用的map传递,所以将Map从Message内取出需要做些处理
            String msg = message.toString();

            System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
            System.out.println("message.toString():" + message.toString());
            System.out.println("message.getBody():" + message.getBody());
            System.out.println("byte[] - > string:" + new String(message.getBody(),"utf-8"));
            System.out.println("message.getMessageProperties():" + message.getMessageProperties());
            System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");

            String[] msgArray = msg.split("'");//可以点进Message里面看源码,单引号直接的数据就是我们的map消息数据
            Map<String, String> msgMap = mapStringToMap(msgArray[1].trim(),3);
            String messageId=msgMap.get("messageId");
            String messageData=msgMap.get("messageData");
            String createTime=msgMap.get("createTime");
*/
            System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
            System.out.println("byte[] - > string:" + new String(message.getBody(),"utf-8"));
            String msg = new String(message.getBody(),"utf-8");
            String[] msgArray = msg.substring(1, msg.length() - 2).split(",",3);
            String messageId = msgArray[1].split("=")[1];
            String messageData = msgArray[2].split("=",2)[1];
            String createTime = msgArray[0].split("=")[1];

            String[] split = messageData.split("'");
            BirthAndDeath birthAndDeath = new BirthAndDeath();
            birthAndDeath.setDate(split[1]);
            birthAndDeath.setName(split[3]);
            birthAndDeath.setBirthOrDeath(split[5]);

            if ("TestDirectQueue".equals(message.getMessageProperties().getConsumerQueue())){
                System.out.println("消费的消息来自的队列名为:"+message.getMessageProperties().getConsumerQueue());
                System.out.println("消费的消息内容:");
                System.out.println("messageId:" + messageId);
                System.out.println("messageData:" + messageData);
                System.out.println("createTime:" + createTime);
                System.out.println("执行TestDirectQueue中的消息的业务处理流程......");
                birthAndDeathMapper.add(birthAndDeath);
                System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");

            }

            if ("fanout.A".equals(message.getMessageProperties().getConsumerQueue())){
                System.out.println("消费的消息来自的队列名为："+message.getMessageProperties().getConsumerQueue());
                System.out.println("消息成功消费到  messageId:"+messageId+"  messageData:"+messageData+"  createTime:"+createTime);
                System.out.println("执行fanout.A中的消息的业务处理流程:");
                birthAndDeathMapper.add(birthAndDeath);
                System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");

            }

            if ("fanout.B".equals(message.getMessageProperties().getConsumerQueue())){
                System.out.println("消费的消息来自的队列名为："+message.getMessageProperties().getConsumerQueue());
                System.out.println("消息成功消费到  messageId:"+messageId+"  messageData:"+messageData+"  createTime:"+createTime);
                System.out.println("执行fanout.B中的消息的业务处理流程:");
                birthAndDeathMapper.add(birthAndDeath);
                System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");

            }

            if ("fanout.C".equals(message.getMessageProperties().getConsumerQueue())){
                System.out.println("消费的消息来自的队列名为："+message.getMessageProperties().getConsumerQueue());
                System.out.println("消息成功消费到  messageId:"+messageId+"  messageData:"+messageData+"  createTime:"+createTime);
                System.out.println("执行fanout.C中的消息的业务处理流程:");
                birthAndDeathMapper.add(birthAndDeath);
                System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");

            }


            channel.basicAck(deliveryTag, true);
//			channel.basicReject(deliveryTag, true);//为true会重新放回队列
        } catch (Exception e) {
            channel.basicReject(deliveryTag, false);
            e.printStackTrace();
        }
    }

    //{key=value,key=value,key=value} 格式转换成map
    private Map<String, String> mapStringToMap(String str,int enNum) {
        str = str.substring(1, str.length() - 1);
        String[] strs = str.split(",",enNum);
        Map<String, String> map = new HashMap<String, String>();
        for (String string : strs) {
            String key = string.split("=")[0].trim();
            String value = null;
            try {
                value = string.split("=")[1];
            } catch (Exception e) {

            }
            map.put(key, value);
        }
        return map;
    }
    
}

//package com.atguigu.config;
//
//import com.rabbitmq.client.Channel;
//import org.springframework.amqp.core.Message;
//import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
//import org.springframework.stereotype.Component;
//import java.util.HashMap;
//import java.util.Map;
//
//@Component
//public class MyAckReceiver implements ChannelAwareMessageListener {
//
//    @Override
//    public void onMessage(Message message, Channel channel) throws Exception {
//        long deliveryTag = message.getMessageProperties().getDeliveryTag();
//        try {
//            //因为传递消息的时候用的map传递,所以将Map从Message内取出需要做些处理
//            String msg = message.toString();
//            String[] msgArray = msg.split("'");//可以点进Message里面看源码,单引号直接的数据就是我们的map消息数据
//            Map<String, String> msgMap = mapStringToMap(msgArray[1].trim(),3);
//            String messageId=msgMap.get("messageId");
//            String messageData=msgMap.get("messageData");
//            String createTime=msgMap.get("createTime");
//            System.out.println("  MyAckReceiver  messageId:"+messageId+"  messageData:"+messageData+"  createTime:"+createTime);
//            System.out.println("消费的主题消息来自："+message.getMessageProperties().getConsumerQueue());
//            channel.basicAck(deliveryTag, true); //第二个参数，手动确认可以被批处理，当该参数为 true 时，则可以一次性确认 delivery_tag 小于等于传入值的所有消息
////			channel.basicReject(deliveryTag, true);//第二个参数，true会重新放回队列，所以需要自己根据业务逻辑判断什么时候使用拒绝
//        } catch (Exception e) {
//            channel.basicReject(deliveryTag, false);
//            e.printStackTrace();
//        }
//    }
//
//    //{key=value,key=value,key=value} 格式转换成map
//    private Map<String, String> mapStringToMap(String str,int entryNum ) {
//        str = str.substring(1, str.length() - 1);
//        String[] strs = str.split(",",entryNum);
//        Map<String, String> map = new HashMap<String, String>();
//        for (String string : strs) {
//            String key = string.split("=")[0].trim();
//            String value = null;
//            try {
//                value = string.split("=")[1];
//            } catch (Exception e) {
//
//            }
//            map.put(key, value);
//        }
//        return map;
//    }
//}